home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1996 April
/
CHIP 1996 aprilis (CD06).zip
/
CHIP_CD06.ISO
/
hypertxt.arj
/
9304
/
CGAEGA.CD
< prev
next >
Wrap
Text File
|
1995-04-19
|
19KB
|
326 lines
@VGrafikus konvertálások -- 3. rész@N
@VCGA, EGA@N
A fekete-fehér üzemmódok után éppen ideje, hogy valami
színesebb témával is foglalkozzunk. Amíg az egyre olcsóbbá
váló VGA teljesen ki nem szorítja, a CGA és EGA adapterek
tekinthetôk hazánkban a legelterjedtebb középkategóriás
vezérlôknek.
Míg a régi monokróm rendszerek, és a piacot egyre inkább
uraló SVGA specifikus jellegûek, a CGA és az EGA általános
célokra készült, mintegy kompromisszumra törekedve a
nagyobb felbontás és az alternatív színhasználat nyújtotta
elônyök között.
Sajnos ismét igaza lett Murphynek: azok a dolgok, amelyek
egyformán jók mindenre, azok semmire sem jók igazán. Ma
már tudjuk, hogy hiba volt a nyolcvanas évek közepén piacra
dobni elôször a CGA, késôbb az EGA rendszereket. A gyártók
nem akartak elfogadhatatlan árakat szabni, a memória
viszont akkor még nagyon drága volt. Emiatt a színek
számának növelésével drasztikusan csökkenteniük kellett a
felbontást. îgy születtek az olyan rémálmok, mint a CGA
160x200 (!) pixeles felbontása 16 színnel, vagy a
320x200-as, 4 színnel. Hamar kiderült persze, hogy ezek a
lehetôségek mind komoly munkára, mind játékra
alkalmatlanok. îgy a fejlesztôk ismét léptek egyet.
Eljutottak 16 színig, de ekkor ""félúton" megtorpantak,
ahelyett, hogy pixelenként további 4 bit felhasználásával
megalkották volna a mai VGA megjelenítôk megfelelôjét.
Furcsa ellentmondásnak tûnik, de egy nagyfelbontású színes
EGA kép (640x350/16) kétszer annyi memóriát igényel, mint a
hozzá képest káprázatos szín- és árnyalathûségû 320x200-as,
szabványos VGA ábrázolások. Egy általános, lapozható EGA
kártya pedig 256 Kbyte memóriával bír, ami bôven elég lenne
egy azonosan nagyfelbontású, ámde 256 színû kép
megjelenítéséhez! Hogy miért nem gyártottak mégis VGA-kat,
azt talán csak a monitorgyártók és a piackutatók tudnák
megmondani. Tény, hogy grafikai szempontból mindkét
rendszer nagyon elônytelenül lett kialakítva, és
komoly tudás kell ahhoz, hogy a szegényes lehetôségek
felhasználásával szépnek nevezhetô képet varázsoljunk a
monitorra.
Emlékeztetôül: a grafikus konvertálásoknak három fázisa
van. Az elsô egy köztes információhalmaz leképzése az
eredeti képrôl, a második a célüzemmód felkészítése a
kapott információ fogadására, végül a harmadik az átvitt
információ megjelenítése az adott üzemmódban. E három fázis
közül a középsôt nem kellett használnunk a monokróm
adapterek esetében. Most erre is rákényszerülünk.
@VCGA@N
Elsôként a nagy veteránnal, a CGA-val foglalkozunk. Két
színes grafikus üzemmóddal kell számolnunk:
160x200/16-ossal és a 320x200/4-essel. Közülük az utóbbi
az elterjedt, a ROM BIOS is csak ezt támogatja.
Hogy megállapíthassuk a vörös, zöld és kék alapszínek
telítettségét egy adott ponton vagy annak környezetében,
tudnunk kell az egyes színek értékhármasát. Az
alappaletta-táblázat tartalmazza ezeket az adatokat (lásd
ott). A 16,7 millió színt tárolni képes átviteli
információ formátumának megfelelôen 0-tól 255-ig vesznek
fel értékeket a pixelek színösszetevôi. Ezek úgy kaphatók
meg, hogy egy alap EGA üzemmódból átvesszük a palettát --
tehetjük, mivel ott is ezek az alapszínek. Ebbôl
visszakapjuk az egyes színekben lévô alapszínek 0-tól 3-ig
terjedô értékeit, és az @KÉRTÉK = (EGA-érték/3) * 255@N
függvény segítségével kapjuk az elôbbi táblázat értékeit.
Most, hogy összetevôkre bontva értelmezni tudunk minden
egyes színt, belevágunk az információ leképzésébe. Elsô
pillantásra szörnyen bonyolultnak tûnik a dolog, de
korántsem az. Választhatjuk azt az egyszerû megoldást is,
hogy az átviteli pont komponenseit egyenlôvé tesszük az
adott fizikai képpont komponensértékeivel -- persze így ott
vagyunk, ahol a part szakad, mivel semmit nem javítottunk
az eredetin. Akárcsak a monokróm konvertálásoknál, itt is
valahogy átlagolnunk kellene a fizikai pont környezetében
lévô pontokat. Igen ám, csakhogy most nem kizárólag fekete
vagy fehér pontokkal találkozhatunk, hanem színesekkel is.
Eddig egyszerûen megszámoltuk egy adott felületen a fehér
képpontokat, ezt elosztottuk a felületen lévô összes pontok
számával, a végén pedig az eredményt 255-tel felszorozva
beillesztettük a köztes file mindhárom komponensébe.
Mindezt azért tehettük meg, mert az alapüzemmód fehér és
fekete színeiben, illetve a létrejövô, feketétôl a fehérig
terjedô szürkeskálában mindhárom színösszetevô kötelezôen
azonos volt. îgy az átlagképzési mûveletet elég volt
elvégezni egyszer, az eredmény mindhárom komponens átlagát
jelentette.
A színes megjelenítôknél a három színkomponens teljesen
független egymástól. Emiatt a színösszetevôk külön
kezelendôk, átlagolandók és összegezendôk a mûveletek során
-- a kép színei ekkor megtartják jellemzôiket. Tehát végsô
soron ugyanúgy járhatunk el, mint a monokróm adaptereknél.
A különbség csupán az, hogy most nem a pontokat, hanem a
pontok azonos komponenseit átlagoljuk egy átviteli képpont
leképzésekor -- külön-külön. îgy három értéket kapunk a
mûveletek után: a vörös, a zöld és a kék átlagot. E három
értéket mentjük el az adathalmaz megfelelô komponenseiként.
A színkomponensenkénti átlagképzés lényege tehát az, hogy
az adott felületen lévô pixelek azonos komponenseinek
összegét elosztjuk a lehetséges maximális
komponensösszeggel, és az eredményt felszorozzuk 255-tel:
@KXkomponensátlag = (Xkomponensek összege / Max@N
@KXkomponensösszeg) * 255@N, ahol az @KX@N a vörös, a zöld
vagy a kék alapszínt jelenti.
Lássuk, mibôl képezzük ezt az átlagot. A kisebb felbontású
alapüzemmódokban nem nagyon bûvészkedhetünk, meg kell
elégednünk azzal, hogy az adott pont környezetében 2x2
képpontos rasztert olvasunk le, vagy ha nem féltjük a
kontrasztot, akkor megpróbálkozhatunk a 3x3-assal is. De ez
a maximum, fôleg ha a 160x200-as üzemmódban vagyunk. Ha
megvan a 4 vagy 9 képpont színértéke, akkor a táblázatból
visszakeressük az adott színhez tartozó komponenseket és
elvégezzük a három átlagképzést, az eredményt pedig
eltároljuk.
Hogy ne legyen ilyen egyszerû az életünk, a fizikai képpont
valódi színének leolvasása csak a 160x200-as üzemmódban
ilyen egyértelmû. A másik, négyszínû üzemmódban további
aljasságok várnak ránk. Az itt kiolvasott színérték ugyanis
nem a valódi színt tartalmazza, hanem csak egy indexet, ami
egy belsô palettára mutat. Két ilyen belsô palettával
rendelkezik a CGA, mindkettô 3+1 színt definiál. A ""+1"
szín a 0-s értékû képpontoké, ez szabadon választható a 16
színû palettáról úgy, hogy háttérszínként beállítjuk. Az
1-es, 2-es és 3-as értékû színek nem módosíthatók, a 0-s
palettánál ezek a zöld (2), a vörös (4) és a barna (6), az
1-es palettánál pedig a ciánkék (3), a bíbor (5) és a
fehér (7).
@VEGA@N
A CGA megjelenítôvel folytatott hiábavaló küzdelem után
rátérhetünk az EGA grafikus lehetôségeire. Itt más
érdekességekkel kerülünk szembe. Továbbra is csak 16 szín
jeleníthetô meg egyszerre, ezek azonban teljesen szabadon
választhatók egy 64 elemû színpalettáról. E paletta minden
elemében meghatározott a vörös, a zöld és a kék színek
telítettsége. A telítettségi skála itt is négy fokozatra
van bontva. Az alapszínek telítettség-hármasainak minden
létezô variációja benne van a palettában (4 a harmadikon =
64). Ez egyébként az alapvetô különbség a CGA 16 és az EGA
64 elemû színválasztéka között. Az elôbbinél az adott
skálabontás mellett lehetséges kombinációknak csak a
negyede választható ki. A másik alapvetô különbség az EGA
sokkal jobb felbontása. Négy fontosabb, azonosan 64/16
színû üzemmóddal fogunk foglalkozni. Ezek a 320x200-as, a
640x200-as, a 640x350-es és a 640x480-as üzemmódok. Utóbbi
voltaképpen nem is EGA, hanem VGA üzemmód, de az azonos
színhasználat és hasonló felbontás miatt EGA-ként
kezelendô.
Ha tudni akarjuk az adott színértékhez tartozó tényleges
színt, akkor ki kell olvasnunk a 16 elemû, éppen érvényben
lévô palettatáblát. Minden palettaelem egy byte, amiben
2--2--2 bit képviseli az egyes alapszínek négyfokozatú
skáláját (formátum = 00rgbRGB). Egy adott szín vörös, zöld
és kék telítettsége a palettatábla ama elemébôl olvasható
ki, aminek az indexe megegyezik a vizsgált színértékkel. Az
adott elembôl kiolvassuk a megfelelô biteket, és
helyiértékeik szerint összeadva ôket megkapjuk az
eredményt. Keretes cikkrészletünkben a citromsárga színen
mutatjuk be a folyamatot.
Vizsgáljuk meg, hogy a színkomponensek ismeretében milyen
lehetôségeink adódnak az átlagképzésre! A 320x200-as és a
640x200-as felbontású üzemmódokban továbbra sem sokat
tehetünk, az alacsony felbontás megköti a kezünket.
Hasonlóan kell tehát dolgoznunk, mint a CGA üzemmódokban --
esetleg a 640x200-as felbontás mellett megkockáztathatjuk a
raszterméret vízszintes kiterjesztését (3x2, 4x2, 4x3 stb).
A dolog a 640x350-es és a 640x480-as felbontásoknál válik
érdekessé. Itt már lehetôségünk -- sôt szükségünk -- lesz
néhány igényesebb trükk bevetésére. Ezek közül az egyik a
többfázisú átlagképzés komponensenként elvégzett változatát
jelenti.
Ha ezekben az üzemmódokban egyszerûen egy 2*2-es, 5*5-ös
vagy még ennél is nagyobb raszter komponenseit átlagolnánk,
akkor -- a monokróm konvertálásokhoz hasonlóan -- kétféle
problémával találnánk magunkat szembe. Kis raszterméretnél
a leképzett információ egymás melletti, elméletileg azonos
színû vagy kis árnyalatkülönbségû pontjai között túl nagy
lenne az indokolatlan színkülönbség. Nagyobb rasztereknél
ugyan teljesen eltûnnének a színkülönbségek, a kép viszont
jóval homályosabb lenne. Ennek az az oka, hogy a kép
felépítése során annak létrehozóját az a szándék vezette,
hogy a kép egy adott felületén -- mivel nem volt képes a
kívánt színt egy fizikai pixellel kifejezni -- olyan
pontokat szórjon viszonylag egyenletesen szét, amelyek
komponenseinek átlaga a lehetô legjobban megközelíti a
kívánt szín komponenseit. És lehet, hogy ezt nem egy
2*2-es vagy 5*5-ös mezôben valósította meg, esetleg nem is
állandó elrendezésben.
Tehát mindenképpen szükségünk van nagy felületek
olvasására, amelyeket azonban nem átlagolhatunk ellenôrzés
nélkül. Szét kell választanunk azokat az értékeket, amelyek
beleszámíthatnak az átlagképzésbe és amelyek nem. Világos,
hogy csak azok az értékek juthatnak át a rostán, amelyek
komponenseiket tekintve viszonylag közel állnak az
alapérték komponenseihez -- csak ezekrôl feltételezhetô,
hogy még ugyanazt a felületet próbálják kifejezni.
Szándékos a ""színpont" helyett az ""érték" kifejezés
használata, hiszen két szomszédos, nagy
színkomponens-különbségû színpontról még elképzelhetô, hogy
azonos színfelületet reprezentálnak, de két egymás
melletti, mondjuk 3x3-as mezô színkomponens-átlagairól már
szerencsére nem mondható el ugyanez -- így sokkal könnyebb
döntenünk.
A többfázisú letapogatás igen jól oldja meg ezt a
feladatot. Ez az eljárás elôször egy 3x3-as mezôt,
mezônként 3x3 képpontot tartalmazó rasztert olvas le a pont
környezetében, azaz összesen 81 pixelt. E pontok
komponenseit 9 pontonként, tehát 3x3-as mezônként
átlagolja. îgy 9 komponensátlagot kapunk, természetesen
mindegyik átlagban külön vörös, zöld és kék értékkel. A 9
mezô átlagai közül a középsô 3x3-as mezô átlagai lesznek az
alapértékek. A többi értéket ehhez fogjuk viszonyítani. Ki
kell tehát választanunk, hogy mely értékek számíthatnak az
átlagképzésbe. Ehhez egy tûréshatárt kell definiálnunk,
mondjuk a maximálisan lehetséges eltérés 25%-át. Meg kell
vizsgálnunk, hogy a komponensek összegzett eltérése az
alapértéktôl eléri-e ezt a tûréshatárt. Az összegzett
eltérés értékét úgy tudjuk kiszámítani, hogy a vizsgált
átlag és az alapátlag azonos komponenseinek az eltérését
összeadjuk: @KDIF =(VR-AR)+(VG-AG)+(VB-AB)@N, ahol @KDIF@N
az eltérés, @KVR, VG, VB@N a vizsgált átlag vörös, zöld és
kék komponensei, @KAR, AG, AB@N pedig az alapérték
ugyanezen összetevôi.
A maximális eltérést is elég könnyen ki tudjuk számítani,
hiszen tudjuk, hogy hány fokozatú az EGA komponenseinek
árnyalati skálája, és azt is tudjuk, hogy hány pontot
átlagoltunk egy mezôben. Az árnyalati skála 0-tól 3-ig
terjed, tehát átszámítás nélkül két pont -- vagy két
átlagolt mezô -- azonos komponense között a különbség
maximálisan 3 egységnyi. E módszert követve a különbség
összesen 9 egység lehet, hiszen három komponensünk van. Ha
egész számokkal dolgozunk, akkor jobban tesszük, ha még a 9
mezô átlagának az elkészítése elôtt átszámítjuk a
színpontok komponensértékeit a 16,7 millió színû (256-os
bontású) skálára, mivel így az élességet sokkal finomabban
tudjuk majd szabályozni, és az árnyalatok átmenetei is
jobbak lesznek. Természetesen akár a raszterméreteket, akár
a skálabontást megváltoztatjuk, a maximális eltérés és
társparaméterei sem maradnak ugyanolyanok. A 8-as ábra
mutatja be a többfázisú átlagképzés elvi vázlatát.
Az utolsó lépésben az átlagba beleszámító értékhármasokat
összetevônként összeadjuk, és az eredményt elosztjuk az
összeget alkotó értékek számával. Ezután, ha még nem tettük
meg, az eredményeket átszámítjuk 16 millió színbe, és
eltároljuk a köztes file-ba.
Miként a monokróm konvertálásoknál, most is kiváló
eredményeket érhetünk el ezzel az eljárással -- érdemes
kipróbálni.
@KNagy Gergely@N
@<9304\EREDETI.GIF> Az eredeti kép, amelyrôl a tesztképek készültek@N
@<9304\2.GIF> CGA tesztkép, amelyrôl visszakonvertáltunk@N
@<9304\3.GIF> EGA tesztkép, amelyrôl visszakonvertáltunk@N
@<9304\4.GIF> A CGA képrôl letapogatott köztes file (egyfázisú@N
@<9304\4.GIF>leképzés, 3x3-as raszter)@N
@<9304\5.GIF>Az EGA képrôl letapogatott köztes file (többfázisú@N
@<9304\5.GIF>leképzés)@N
@VAlappaletta@N
A 160x200-as CGA, az indexelt CGA és a standard EGA üzemmód
alapértelmezés szerinti színértékeinek RGB komponensei:
Index Binárisan Red Green Blue
0 000|000 0 0 0
1 000|001 0 0 170
2 000|010 0 170 0
3 000|011 0 170 170
4 000|100 170 0 0
5 000|101 170 0 170
6 010|100 170 85 0
7 000|111 170 170 170
8 111|000 85 85 85
9 111|001 85 85 255
10 111|010 85 255 85
11 111|011 85 255 255
12 111|100 255 85 85
13 111|101 255 85 255
14 111|110 255 255 85
15 111|111 255 255 255
@VCitromsárga szín@N
Az adott pixel színkomponenseinek kiszámítása a megfelelô
palettaelem byte segítségével:
Palettaelem = decimális 62, bináris 111|110.
Színkomponens r g b R G B
Bithelyiérték 85r 85g 85b 170r 170g 170b
Sárgában szerepel 1 1 1 1 1 0
Összegzett eredmény: vörös=255r, zöld=255g, kék=85b; avagy:
R,G,B = 255,255,85.